package com.hifar.test.api.client;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.hifar.test.api.config.ApiConfig;
import com.hifar.test.api.model.DataRequest;
import com.hifar.test.api.model.DataResponse;
import com.hifar.test.api.util.AuthUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;

/**
 * 数据资产管理平台客户端
 * 用于与数据资产管理平台进行数据交互
 */
@Component
public class DataPlatformClient {
    
    private static final Logger logger = LoggerFactory.getLogger(DataPlatformClient.class);
    
    @Autowired
    private ApiConfig apiConfig;
    
    @Autowired
    private RestTemplate restTemplate;
    
    private final ObjectMapper objectMapper = new ObjectMapper();
    
    /**
     * 发送数据到数据资产管理平台
     * 
     * @param dataRequest 数据请求
     * @param username 用户名
     * @param password 密码
     * @return 响应结果
     * @throws Exception 发送异常
     */
    public DataResponse sendData(DataRequest dataRequest, String username, String password) throws Exception {
        return sendData(dataRequest, username, password, null);
    }
    
    /**
     * 发送数据到数据资产管理平台
     * 
     * @param dataRequest 数据请求
     * @param username 用户名
     * @param password 密码
     * @param customPublicKey 自定义公钥
     * @return 响应结果
     * @throws Exception 发送异常
     */
    public DataResponse sendData(DataRequest dataRequest, String username, String password, String customPublicKey) throws Exception {
        // 记录请求日志
        if (apiConfig.getEnableLogging()) {
            logger.info("发送数据到数据资产管理平台: {}", objectMapper.writeValueAsString(dataRequest));
        }
        
        // 生成认证头
        String authHeader = customPublicKey != null ? 
                AuthUtil.generateBasicAuth(username, password, customPublicKey) :
                AuthUtil.generateBasicAuth(username, password);
        
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Authorization", authHeader);
        
        // 创建请求实体
        HttpEntity<DataRequest> requestEntity = new HttpEntity<>(dataRequest, headers);
        
        // 发送请求
        ResponseEntity<DataResponse> response = restTemplate.exchange(
                apiConfig.getBaseUrl(),
                HttpMethod.POST,
                requestEntity,
                DataResponse.class
        );
        
        // 记录响应日志
        if (apiConfig.getEnableLogging()) {
            logger.info("数据资产管理平台响应: {}", objectMapper.writeValueAsString(response.getBody()));
        }
        
        return response.getBody();
    }
    
    /**
     * 使用默认凭据发送数据
     * 
     * @param dataRequest 数据请求
     * @return 响应结果
     * @throws Exception 发送异常
     */
    public DataResponse sendDataWithDefaultAuth(DataRequest dataRequest) throws Exception {
        return sendData(dataRequest, apiConfig.getDefaultUsername(), apiConfig.getDefaultPassword());
    }
    
    /**
     * 使用自定义公钥发送数据
     * 
     * @param dataRequest 数据请求
     * @param username 用户名
     * @param password 密码
     * @param publicKey 自定义公钥
     * @return 响应结果
     * @throws Exception 发送异常
     */
    public DataResponse sendDataWithCustomKey(DataRequest dataRequest, String username, String password, String publicKey) throws Exception {
        return sendData(dataRequest, username, password, publicKey);
    }
    
    /**
     * 测试连接
     * 
     * @param username 用户名
     * @param password 密码
     * @return 是否连接成功
     */
    public boolean testConnection(String username, String password) {
        try {
            // 创建测试请求
            DataRequest testRequest = new DataRequest();
            testRequest.setModelCode("TEST");
            testRequest.setDataStatus(1);
            testRequest.setData(Arrays.asList());
            
            // 发送测试请求
            DataResponse response = sendData(testRequest, username, password);
            
            // 检查响应状态
            return response != null && response.getStatus() != null;
        } catch (Exception e) {
            logger.error("测试连接失败", e);
            return false;
        }
    }
}
